package com.dm.yyxr.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dm.yyxr.mapper.AdminMapper;
import com.dm.yyxr.pojo.Admin;
import com.dm.yyxr.pojo.Area;
import com.dm.yyxr.pojo.dto.AdminDto;
import com.dm.yyxr.pojo.dto.CommunityDto;
import com.dm.yyxr.pojo.dto.SupplyAndConsumptions;
import com.dm.yyxr.pojo.dto.SupplyAndConsumptionsDto;
import com.dm.yyxr.service.AdminService;
import com.dm.yyxr.service.AreaService;
import com.dm.yyxr.service.CommunityService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements AdminService{
    @Autowired
    AreaService areaService;
    @Autowired
    CommunityService communityService;

    /**
     *数据库中执行分页查询返回分页结果
     * @param pageNo
     * @return
     */
    @Override
    public Page<AdminDto> getAdmins(Integer pageNo) {
        //传入页码和每页记录数（设置为5）作为参数创建Page<>
        Page<Admin> res = new Page<>(pageNo,5);
        //调用selectPage方法，将在数据库中执行分页查询，返回一个包含查询结果的Page对象
        res = baseMapper.selectPage(res, null);
        //从res中获取查询结果的记录列表
        List<Admin> records = res.getRecords();
        //每个Admin对象映射为相应的AdminDto对象，并收集到一个列表
        List<AdminDto> collect = records.stream().map((admin -> {
            AdminDto adminDto = new AdminDto();
            BeanUtils.copyProperties(admin, adminDto);
            Area area = areaService.getById(admin.getArea_code());
            adminDto.setArea(area.getArea_name());
            return adminDto;
        })).collect(Collectors.toList());
        //创建一个空的Page<AdminDto>对象
        Page<AdminDto> page = new Page<>();
        //将res中的属性复制到page中。这将包括页码、每页记录数和总记录数等属性
        BeanUtils.copyProperties(res,page);
        //将转换后的collect列表设置为page的记录列表
        page.setRecords(collect);
        return page;
    }

    /**
     * 根据管理员ID获取区域信息的分页列表
     * @param id
     * @param pageNo
     * @return
     */
    @Override
    public Page<CommunityDto> getCommunity(Integer id, int pageNo) {
        //查询并返回对应的管理员对象admin
        Admin admin = baseMapper.selectById(id);
        //通过getCommunities方法获取社区信息的分页列表，参数为管理员所属地区的区域代码和页码，返回一个类型为Page<CommunityDto>的分页结果
        return communityService.getCommunities(admin.getArea_code(),pageNo);
    }

    /**
     * 根据供需信息查询管理员和社区信息
     * @param supplyAndConsumptions
     * @return
     */
    @Override
    public SupplyAndConsumptionsDto getSupplyAndConsumptions(SupplyAndConsumptions supplyAndConsumptions) {
        //通过baseMapper使用selectById方法查询并返回与参数supplyAndConsumptions中的管理员代码(admin_code)对应的管理员对象admin
        Admin admin = baseMapper.selectById(supplyAndConsumptions.getAdmin_code());
        //查询并返回供需信息。该方法接受三个参数，分别是管理员所属地区代码(admin.getArea_code())、
        // 提供或需求的月份(supplyAndConsumptions.getMonth())
        // 以及街道代码(supplyAndConsumptions.getCommunity_code())
        return baseMapper.getSupplyAndConsumptions(admin.getArea_code(),supplyAndConsumptions.getMonth(),supplyAndConsumptions.getCommunity_code());
    }

    /**
     * 根据管理员名称查询管理员对象
     * @param admin_name
     * @return
     */
    @Override
    public Admin getByAdminName(String admin_name) {
        //创建条件查询器
        LambdaQueryWrapper<Admin> queryWrapper = new LambdaQueryWrapper<>();
        //使用eq方法将管理员名称字段(Admin::getAdmin_name)和传入的admin_name进行等于（相等）的匹配
        queryWrapper.eq(Admin::getAdmin_name,admin_name);
        return baseMapper.selectOne(queryWrapper);
    }
}
